/*
定义了一个简单的队列数据结构，并使用 prototype 给队列对象添加了常见的操作方法，使其具有队列的基本功能：入队、出队、获取队列大小、获取队列头部元素、清空队列以及检查队列是否为空。
在 JavaScript 中，通过 prototype 可以实现对象的继承和方法的共享。在这里，将方法添加到 Queue.prototype 上意味着所有通过 new Queue() 创建的对象都可以访问和共享这些方法
*/
function Queue() {
  this.B = []; // 使用 this.B 来定义实例变量，而不是局部变量
  // 不再在构造函数内部定义方法，而是在构造函数外部使用 Queue.prototype 定义方法
}
// 向队列尾部添加元素 C。如果 C 是 null，则返回 -1，表示添加失败。否则，将元素 C 添加到数组 B 的末尾。
Queue.prototype.EnQueue = function (C) {
  if (C == null) {
    return -1;
  }
  this.B.push(C);
};
// 向队列头部添加元素 C。如果 C 是 null，则返回 -1，表示添加失败。否则，将元素 C 添加到数组 B 的末尾。
Queue.prototype.HeQueue = function (C) {
  if (C.length == 0) {
    return -1;
  }
  this.B.unshift(...C);
};
// 移除并返回队列的第一个元素。如果队列为空（即 B.length == 0），则返回 null。否则，使用 shift() 方法从数组 B 的开头移除并返回第一个元素
Queue.prototype.DeQueue = function () {
  if (this.B.length == 0) {
    return null;
  } else {
    return this.B.shift();
  }
};
// 返回整个数组
Queue.prototype.GetAll = function () {
  return this.B;
};
// 返回当前队列的大小，即数组 B 的长度
Queue.prototype.GetSize = function () {
  return this.B.length;
};
// 返回队列的第一个元素，但不移除它。如果队列为空，返回 null。
Queue.prototype.GetHead = function () {
  if (this.B.length == 0) {
    return null;
  } else {
    return this.B[0];
  }
};
// 清空队列，将数组 B 的长度设置为 0，以移除所有元素
Queue.prototype.MakeEmpty = function () {
  this.B.length = 0;
};
// 检查队列是否为空。如果数组 B 的长度为 0，返回 true；否则返回 false
Queue.prototype.IsEmpty = function () {
  return this.B.length === 0;
};

export const oQueue = new Queue();
